package io.renren.modules.sys.controller;

import com.github.pagehelper.PageInfo;
import io.renren.common.annotation.SysLog;
import io.renren.common.pojo.R;
import io.renren.common.util.Constant;
import io.renren.common.validator.ValidatorUtils;
import io.renren.modules.sys.entity.SysRoleEntity;
import io.renren.modules.sys.pojo.SysRoleMenuDTO;
import io.renren.modules.sys.pojo.SysRoleQuery;
import io.renren.modules.sys.service.SysRoleMenuService;
import io.renren.modules.sys.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 角色管理
 * 
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2016年11月8日 下午2:18:33
 */
@RestController
@RequestMapping("/sys/role")
@Api(description = "角色管理接口")
public class SysRoleController extends BaseSysController {
	@Autowired
	private SysRoleService sysRoleService;
	@Autowired
	private SysRoleMenuService sysRoleMenuService;
	
	/**
	 * 角色列表
	 */
	@GetMapping("/list")
	@PreAuthorize("hasAuthority('sys:role:list')")
	@ApiOperation("获取角色列表")
	public R<PageInfo<SysRoleEntity>> list(SysRoleQuery query){
		//如果不是超级管理员，则只查询自己创建的角色列表
		if(getUserId() != Constant.SUPER_ADMIN){
			query.setCreateUserId(getUserId());
		}

		PageInfo<SysRoleEntity> pageInfo = sysRoleService.queryPage(query);
		return R.ok(pageInfo);
	}
	
	/**
	 * 角色列表
	 */
	@GetMapping("/select")
	@PreAuthorize("hasAuthority('sys:role:select')")
	@ApiOperation("获取当前账号角色列表")
	public R<List<SysRoleEntity>> select(){
		SysRoleQuery query = new SysRoleQuery();

		//如果不是超级管理员，则只查询自己所拥有的角色列表
		if(getUserId() != Constant.SUPER_ADMIN){
			query.setCreateUserId(getUserId());
		}
		List<SysRoleEntity> list = sysRoleService.queryList(query);
		
		return R.ok(list);
	}
	
	/**
	 * 角色信息
	 */
	@GetMapping("/info/{roleId}")
	@PreAuthorize("hasAuthority('sys:role:info')")
	@ApiOperation("获取角色信息")
	public R<SysRoleMenuDTO> info(@ApiParam("角色ID") @PathVariable("roleId") Long roleId){
		SysRoleMenuDTO dto = new SysRoleMenuDTO();

		SysRoleEntity role = sysRoleService.queryObject(roleId);
		dto.setRole(role);

		//查询角色对应的菜单
		List<Long> menuIdList = sysRoleMenuService.queryMenuIdList(roleId);
		dto.setMenuIdList(menuIdList);
		
		return R.ok(dto);
	}
	
	/**
	 * 保存角色
	 */
	@SysLog("保存角色")
	@PostMapping("/")
	@PreAuthorize("hasAuthority('sys:role:save')")
	@ApiOperation("保存角色")
	public R save(@ApiParam("角色对象") @RequestBody SysRoleMenuDTO role){
		ValidatorUtils.validateEntity(role);
		
		role.setCreateUserId(getUserId());
		sysRoleService.save(role);
		
		return R.ok();
	}
	
	/**
	 * 修改角色
	 */
	@SysLog("修改角色")
	@PutMapping("/")
	@PreAuthorize("hasAuthority('sys:role:update')")
	@ApiOperation("更新角色")
	public R update(@ApiParam("角色对象") @RequestBody SysRoleMenuDTO role){
		ValidatorUtils.validateEntity(role);
		
		role.setCreateUserId(getUserId());
		sysRoleService.update(role);
		
		return R.ok();
	}
	
	/**
	 * 删除角色
	 */
	@SysLog("删除角色")
	@DeleteMapping("/")
	@PreAuthorize("hasAuthority('sys:role:delete')")
	@ApiOperation("删除角色")
	public R delete(@ApiParam("角色ID列表") @RequestBody Long[] roleIds){
		sysRoleService.deleteBatch(roleIds);
		
		return R.ok();
	}
}
